package com.snow.useviewdemo;

/**
 * author : zyt
 * e-mail : 632105276@qq.com
 * date   : 2020-03-02
 * desc   :算法伪代码
 */
public class AlgorithmTest {
    //冒泡排序
    // 冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列，一次比较两个元素，如果它们的顺序错误就把它们交换过来。
    public int[] maoPaoSort(int[] arr) {
        int arrLength = arr.length;
        for (int i = 0; i < arrLength - 1; i++) {//执行到倒数第二就可以
            for (int j = 0; j < arrLength - 1 - i; j++) {//执行长度不需要是arrLength
                if (arr[j] > arr[j + 1]) {//交换位置
                    int temp = arr[j + 1];
                    arr[j + 1] = arr[j];
                    arr[j] = temp;
                }
            }
        }
        return arr;
    }

    //选择排序
    //它的工作原理：首先在未排序序列中找到最小（大）元素，存放到排序序列的起始位置，然后，再从剩余未排序元素中继续寻找最小（大）元素，然后放到已排序序列的末尾。以此类推，直到所有元素均排序完毕。
    public int[] selectSort(int[] arr) {
        int arrLength = arr.length;
        int minIndex;
        int temp;
        for (int i = 0; i < arrLength; i++) {
            minIndex = i;

            for (int j = i; j < arrLength; j++) {
                if (arr[j] < arr[minIndex]) {
                    minIndex = j;
                }
            }
            temp = arr[i];
            arr[i] = arr[minIndex];
            arr[minIndex] = temp;
        }
        return arr;
    }

    //插入排序
    //它的工作原理是通过构建有序序列，对于未排序数据，在已排序序列中从后向前扫描，找到相应位置并插入。
    public int[] insertionSort(int[] arr) {
        int length = arr.length;
        int preIndex, current;
        for (int i = 1; i < length; i++) {
            preIndex = i - 1;
            current = arr[i];
            while (preIndex >= 0 && arr[preIndex] > current) {
                arr[preIndex + 1] = arr[preIndex];
                preIndex--;
            }
            arr[preIndex + 1] = current;
        }
        return arr;
    }
}
